home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / macros / latex209 / contrib / misc / balanced.sty (.txt) < prev    next >
LaTeX Document  |  1993-04-01  |  2KB  |  58 lines

  1. % The twocolumns environment can be used anywhere in a one column document to
  2. % produce two column output.  The twocolumns environment may extend for an
  3. % unlimited number of pages, and start and finish mid-page.  Columns are
  4. % always balanced.  The code works very hard to avoid two-column ``widows''
  5. % and ``orphans''.  No inserts are supported (haven't worked out where to put
  6. % them yet).
  7. \newbox\partialpage
  8. \newbox\leftcolumn
  9. \newdimen\dimen@
  10. \newdimen\colsize
  11. \newdimen\lastpageshrink
  12. \newdimen\dimend
  13. \newenvironment{twocolumns}{\begingroup \global\@twocolumntrue
  14. \def\fps@table{t}
  15.    \pagegoal=2\textheight
  16.    \lastpageshrink=\pageshrink
  17.    \output={\global\setbox\partialpage=\vbox{\unvbox255}}\penalty-10000%
  18.    \def\columnout{\trycolumnout}%
  19.    \output={\columnout}%
  20.    \hsize=\textwidth \advance\hsize-\columnsep \divide\hsize by 2
  21.    \columnwidth=\hsize \linewidth=\hsize
  22.    \global\colsize=\textheight
  23.    \global\advance\colsize by-\ht\partialpage
  24.    \vsize=\colsize
  25.    \global\advance\vsize by\lastpageshrink
  26.    \multiply\vsize by2}%
  27. % \end{twocolumns}
  28.    {\pagegoal=4\textheight
  29.    \output={\balancecolumns\pagesofar}\break
  30.    \endgroup \global\vsize=\textheight \pagegoal=\vsize}
  31. \def\pagesofar{\unvbox\partialpage%
  32.    \wd0=\hsize \wd2=\hsize \hbox to\textwidth{\box0\hfil\box2}}
  33. \def\balancecolumns{\setbox0\vbox{\unvbox255} \dimen@=\ht0
  34.    \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip
  35.    \divide\dimen@ by2 \splittopskip=\topskip
  36.    {\vbadness=10000 \loop \global\setbox3=\copy0
  37.      \global\setbox1=\vsplit3 to\dimen@
  38.      \ifdim\ht3>\dimen@ \global\advance\dimen@ by1pt\repeat}
  39.    \ifdim\dimen@>\textheight \dimen@=\textheight\fi
  40.    \setbox0=\vbox to \dimen@{\unvbox1} \setbox2=\vbox to \dimen@{\unvbox3}
  41.    \if\ht0>\ht2\setbox2=\vbox to\ht0{\unvbox2}\else
  42.    \if\ht2>\ht0\setbox0=\vbox to\ht2{\unvbox0}\fi\fi}
  43. \def\trycolumnout{%
  44. %   \@dblfloatplacement
  45.    \global\def\columnout{\leftcolumnout}
  46.    \global\vsize=\colsize
  47.    \unvbox255\penalty\outputpenalty}
  48. \def\leftcolumnout{%
  49.    \global\def\columnout{\rightcolumnout}
  50.    \global\setbox\leftcolumn=\vbox to\vsize{\unvbox255}}
  51. \def\rightcolumnout{%
  52.    \global\def\columnout{\trycolumnout}
  53.    \setbox0=\box\leftcolumn
  54.    \setbox2=\vbox to \vsize{\unvbox255}
  55.    \setbox\@outputbox=\vbox{\pagesofar}\@outputpage
  56.    \global\colsize=\textheight
  57.    \global\vsize=2\colsize}
  58.